﻿using System.IO;
using RiskMan.Config;
using RiskMan.DataClass.Models;
using RiskMan.Views.Dialogs;
using System;
using System.Collections.Generic;
using System.Reflection;
using XlDde;

namespace RiskMan.Providers.Channels
{
    class DDEChannelAllTrades : XlDdeChannel
    {
        private List<AllTradesModels> list;

        public DDEChannelAllTrades()
        {

        }

        protected override void ProcessTable(XlTable xt, string topic)
        {
            list = RiskMan.MainWindow.StaticLevel._dataProvider.AllTradesList;

            try
            {
                for (int i = 0; i < xt.Rows; i++)
                {
                    AllTradesModels tmp = new AllTradesModels();
                    String time = "";
                    List<String> names = new List<String>();



                    for (int j = 0; j < xt.Columns; j++)
                    {
                        xt.ReadValue();
                        if (Namespace.Count == 0 && i == 0)
                        {
                            tmp = null;
                            names.Add(xt.StringValue);
                        }
                        else
                        {
                            
                            if (IsSend(xt) == true)
                            {
                                try
                                {
                                    if (Namespace[j] == "TRADENUM") 
                                        tmp.TradeNum = (long)xt.FloatValue;
                                    if (Namespace[j] == "TRADEDATE")
                                        tmp.TradeDate = DateTime.Parse(time + " " + xt.StringValue);
                                    if (Namespace[j] == "TRADETIME")
                                        tmp.TradeTime = DateTime.Parse(time + " " + xt.StringValue);
                                    if (Namespace[j] == "SECCODE") 
                                        tmp.Seccode = xt.StringValue;
                                    if (Namespace[j] == "CLASSCODE")
                                        tmp.ClassCode = xt.StringValue;
                                    if (Namespace[j] == "PRICE") tmp.Price = xt.FloatValue;
                                    if (Namespace[j] == "QTY") tmp.Quantity = (int)xt.FloatValue;
                                    if (Namespace[j] == "BUYSELL")
                                        if (xt.StringValue == "B")
                                            tmp.Operation = Cfg.Buy;
                                        else
                                            tmp.Operation = Cfg.Sell;
                                    if (Namespace[j] == "VALUE") tmp.Value = xt.FloatValue;

                                }
                                catch (ArgumentOutOfRangeException)
                                {
                                    string message = "\"Таблица всех сделок\" в разных терминалах настроены по разному. \n\r" +
                                        "Для правильной настройки таблице ознакомьтесь с инструкцией." +
                                        "\n\rНеобходимо чтоб название и количество выводимых параметров совпадало.";
                                    if (base.IsShowMessage == false)
                                    {
                                        base.IsShowMessage = true;
                                        new DialogMessage(message, "Ошибка");
                                    }
                                    Cfg.SetLog(message, RiskMan.MainWindow.StaticLevel.ListBox_Logs, GetType(), MethodBase.GetCurrentMethod());
                                }
                                catch (Exception ex)
                                {
                                    new DialogMessage(ex.Message, "DDEChannelAllTradesList");
                                }
                            }
                            else
                            {
                                tmp = null;
                            }
                        }
                    }
                    if (tmp != null)
                    {
                        if (list.Count != 0)
                        {
                            if (list[list.Count - 1].TradeNum < tmp.TradeNum)
                            {
                                list.Add(tmp);
                            }
                            if (tmp.TradeNum == tmp.Quantity)
                            {
                            }
                        }
                        else 
                        {
                            list.Add(tmp);
                        }
                    }
                    if (names.Count > 0)
                        Namespace = new List<String>(names);
                }
            }
            catch (Exception ex)
            {
                new DialogOkCancel(ex.Message, "DDEChannelAllTradesList");
            }
        }

        public override void Disconnected(bool isConnected)
        {
            Namespace.Clear();
            QuikIntegration.dde.QuikUtil.StartDDE();
        }
    }
}
